package com.util.impl;

import com.util.TypeConverter;

import java.time.*;
import java.util.Date;

/**
 * @ClassName DateConverter
 * @Description TODO
 * @Author Kx
 * @Date 2025/3/21 16:17
 * @Version 1.0
 */
public class DateConverter implements TypeConverter {
    /*** 
     * @author: kx
     * @date: 2025/3/21 16:18
     * @param fieldType 数据转换的目标类型
     * @return boolean 如果字段类型为上述四种日期类型之一，则返回 true；否则返回 false
     * @description: 实现把查询数据转换为以下传统的日期类型：
     * java.util.Date
     * java.sql.Date
     * java.sql.Time、
     * java.sql.Timestamp
    */
    @Override
    public boolean supports(Class<?> fieldType) {
        // 判断目标类型是否为上述四种日期类型之一
        return fieldType == java.util.Date.class ||
                fieldType == java.sql.Date.class ||
                fieldType == java.sql.Time.class ||
                fieldType == java.sql.Timestamp.class;
    }

    /***
     * @author: kx
     * @date: 2025/3/22 12:17
     * @param fieldType 目标类型(就是把这个类型转换成需要的类型)
     * @param value 查询数据
     * @return java.lang.Object
     * @description: 实现把查询数据转换为以下传统的日期类型：
    */
    @Override
    public Object apply(Class<?> fieldType, Object value) {
        // 获取目标类型名称(获取全类名)
        String name = fieldType.getName();
        // 获取目标类型的毫秒值
        long time = getTime(value);
        switch (name) {
            case "java.util.Date":
                return new Date(time);
            case "java.sql.Date":
                return new java.sql.Date(time);
            case "java.sql.Time":
                return new java.sql.Time(time);
            case "java.sql.Timestamp":
                return new java.sql.Timestamp(time);
        }
        return null;
    }


    /***
     * @author: kx
     * @date: 2025/3/22 11:38
     * @param value 日期时间
     * @return long
     * @description: 把各种时间类型转换为毫秒数
    */
    private long getTime(Object value){
        if (value instanceof LocalDateTime){
            // LocalDateTime转换为Date然后获取毫秒数
            return LocalDateTimeToDate((LocalDateTime) value).getTime();
        }else if (value instanceof LocalDate){
            // LocalDate转换为Date然后获取毫秒数
            return LocalDateToDate((LocalDate) value).getTime();
        }else if (value instanceof LocalTime){
            // LocalTime转换为Date然后获取毫秒数
            return LocalTimeToDate((LocalTime) value).getTime();
        }else if (value instanceof Date){
            // Date转换为毫秒数
            return ((Date) value).getTime();
        } else {
            throw new IllegalArgumentException("Unsupported conversion from " + value.getClass() + ".");
        }
    }


    /***
     * @author: kx
     * @date: 2025/3/22 11:49
     * @param localDateTime 需要转换的LocalDateTime
     * @return java.util.Date
     * @description: 将LocalDateTime转换为Date
    */
    private Date LocalDateTimeToDate(LocalDateTime localDateTime){
        // 获取当前时区
        ZoneId zoneId = ZoneId.systemDefault();
        // 将LocalDateTime转换为Instant
        Instant instant = localDateTime.atZone(zoneId).toInstant();
        return Date.from(instant);
    }


    /***
     * @author: kx
     * @date: 2025/3/22 11:51
     * @param localDate 需要转换的LocalDate
     * @return java.util.Date
     * @description: 将LocalDate转换为Date
    */
    private Date LocalDateToDate(LocalDate localDate){
        // 获取当前时区
        ZoneId zoneId = ZoneId.systemDefault();
        // 将LocalDate转换为Instant
        Instant instant = localDate.atStartOfDay().atZone(zoneId).toInstant();
        return Date.from(instant);
    }

    /***
     * @author: kx
     * @date: 2025/3/22 11:53
     * @param localTime 需要转换的LocalTime
     * @return java.util.Date
     * @description: 将LocalTime转换为Date
    */
    private Date LocalTimeToDate(LocalTime localTime){
        // 获取当前时区
        ZoneId zoneId = ZoneId.systemDefault();
        // 将LocalTime转换为Instant
        Instant instant = localTime.atDate(LocalDate.now()).atZone(zoneId).toInstant();
        return Date.from(instant);
    }
}
